package com.pe.pgn.clubpgn.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.CatalogoDao;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdTipoTarjetaPersona;
import com.pe.pgn.clubpgn.domain.ClpmCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNCatalogoDetalle;
import com.pe.pgn.clubpgn.service.CatalogoService;
import com.pe.pgn.clubpgn.service.NoExisteAlmacenException;
import com.pe.pgn.clubpgn.service.NoExisteArticuloException;

/**
 * @author Edwin Farfan
 */
@Service("catalogoService")
public class CatalogoServiceImpl implements CatalogoService{
	
	@Autowired
	private CatalogoDao dao;
	
	public List<ClpmCatalogo> obtenerListaCatalogos(){
		return dao.obtenerListaCatalogos();
	}
	
	public ClpmCatalogo obtenerCatalogo(Long id){
		return dao.obtenerCatalogo(id);
	}
	
	public int eliminarCatalogo(Long id){
		return dao.eliminarCatalogo(id);
	}
	
	public List<ClpmCatalogo> busquedaCatalogo(String descripcion, String codigo, 
			String tipoTarjeta, String fechaInicio, String fechaFin, String estado){
		return dao.busquedaCatalogo(descripcion, codigo,tipoTarjeta, fechaInicio,fechaFin,estado);
	}

	public List<BNCatalogo> obtenerTodoCatalogos(boolean itemDefault) {
		return dao.obtenerTodoCatalogos(itemDefault);
	}
	
	public int existeCatalogoRangoFecha(String fechaInicio, String fechaFin, Long catalogoID){
		return dao.existeCatalogoRangoFecha(fechaInicio, fechaFin, catalogoID);
	}
	

	public int cantidadPremiosCatalogo(String idCatalogo){
		int cantidad=dao.cantidadPremiosCatalogo(idCatalogo);

		return cantidad;
	}
	
	/***
	 *(non-Javadoc)
	 * @see com.pe.pgn.clubpgn.service.CatalogoService#guardarCatalogo(com.pe.pgn.clubpgn.domain.ClpmCatalogo)
	 */

	public int saveCatalogo(ClpmCatalogo catalogo) throws NoExisteAlmacenException,Exception{
		
		//obtener la lista de articulos
		List<BNCatalogoDetalle> listaArticulos = catalogo.getCatalogoDetalle();
		int encontro=0;
		
		dao.guardarCatalogo(catalogo);
		//int secuencia=0;
		
		//eliminar el stockAlmacenCatalogo
		dao.eliminarPremiosCatalogo(catalogo);
			
		for (BNCatalogoDetalle bnCatalogoDetalle : listaArticulos) {
			
			if(bnCatalogoDetalle !=null && bnCatalogoDetalle.getIdArticulo()!=null){
				ClpdArticulo articulo= dao.obtenerArticulo(bnCatalogoDetalle);
				ClpbAlmacen almacen=new ClpbAlmacen();
				if(articulo != null){
					
					if(articulo.isStNoManejaStock()){
						almacen=dao.getClpbAlmacen();
						if(almacen == null){
							throw new NoExisteAlmacenException("Excepcion Controlada: no existe almacen virtual");
						}
					}
					
					if(bnCatalogoDetalle.getIdPremioCatalogo()==null && bnCatalogoDetalle.getNuCanjesMaxVenta()!=null ){
						if(!bnCatalogoDetalle.getNuCanjesMaxVenta().equalsIgnoreCase(CLPConstantes.ESPACIO_VACIO) ){
							
							encontro= dao.validarCodInstRepetido(catalogo.getInicioVigencia(), catalogo.getFinCanje(),Integer.parseInt(bnCatalogoDetalle.getCoPremioInstantaneo()));	

						}
					}else	
					if( bnCatalogoDetalle.getIdPremioCatalogo()==null && bnCatalogoDetalle.getNuDiasVencimiento()!=null ){
						if(!bnCatalogoDetalle.getNuDiasVencimiento().equalsIgnoreCase(CLPConstantes.ESPACIO_VACIO)){
							
							encontro= dao.validarCodInstRepetido(catalogo.getInicioVigencia(), catalogo.getFinCanje(),Integer.parseInt(bnCatalogoDetalle.getCoPremioInstantaneo()));	

						}
					}
						
					if(encontro!=0){
						return 0;
					}

					dao.guardarTodoCatalogo(catalogo,bnCatalogoDetalle, articulo,almacen);
				}else{
					throw new NoExisteArticuloException("Excepcion Controlada: no existe Articulo"); 
				}
			}
		}
		return 1;
	}
	
	public void setEliminacionPremioCatalogo(ClpmCatalogo catalogo){
		dao.setEliminacionPremioCatalogo(catalogo);
	}
	
	public void inactivarCatalogo(ClpmCatalogo catalogo){
		dao.inactivarCatalogo(catalogo);
	}
	
	public boolean vigenciaCatalogo(ClpmCatalogo catalogo){
		return dao.vigenciaCatalogo(catalogo); 
	}
	
	public ClpdTipoTarjetaPersona  obtenerTipoTarjetaPersona(Long id){
		return dao.obtenerTipoTarjetaPersona(id);
	}

	public int existeCatalogoDescription(String deCatalogo, Long id) {
		return dao.existeCatalogoDescription(deCatalogo, id);
	}

	public int existeCatalogoCodigoCatalog(String coCodigoCatalogo, Long id) {
		return dao.existeCatalogoCodigoCatalog(coCodigoCatalogo, id);
	}


	public int darbajaPremio(Long id) {
		return dao.darbajaPremio(id);
	}
	
	public BNCatalogoDetalle obtenerCatalogoxPremio(Long id, Long idpremio){
		return dao.obtenerCatalogoxPremio(id, idpremio);
	}

	@Override
	public String desasignarPremios(BNCatalogoDetalle catalogo) {
		int resultado=0;
		List<Map<String,Object>> map=null;
		HashMap mape=null;
		Long idbddocumento=null;
		BigDecimal restar=new BigDecimal(0);
		BigDecimal stockCatalogo= null;
		BigDecimal stockCatalogoespejo= null;
	
		//--obtener Stock_alamacen_catalogo --//
		map=dao.obtenerStockAlmacen(catalogo.getIdCatalogo(), catalogo.getIdPremioCatalogo());
		if(map!=null){		
		String res=dao.generarDocumentoDarBajaPremioCatalogo(catalogo.getIdCatalogo(),catalogo.getIdPremioCatalogo(),catalogo.getIdArticulo(),resultado);
		if(!res.equals("Error")){
			idbddocumento=Long.parseLong(res);
			for(int i=0; i<map.size();i++){
			
				mape = (HashMap)map.get(i);
				String cantidad=mape.get("vaCantidad").toString();
	
				String respuesta=dao.documentoDetalleDarBajaPremios( mape.get("id").toString(), idbddocumento,mape.get("coAlmacen").toString() , 
				mape.get("vaStockCatalogo").toString()	, mape.get("coPremioCatalogo").toString() , mape.get("coCatalogo").toString() ,mape.get("vaCantidad").toString(),mape.get("coArticulo").toString());

				if(respuesta!=null){	
					restar=restar.add(new BigDecimal(respuesta));	
				}
				
				}
		
			if(catalogo.getVaStockCatalogo()!=null || catalogo.getVaStockCatalogoEspejo()!=null){
				stockCatalogo= new BigDecimal(catalogo.getVaStockCatalogo());
				stockCatalogo= stockCatalogo.subtract(restar);
				stockCatalogoespejo=new BigDecimal(catalogo.getVaStockCatalogoEspejo());
				stockCatalogoespejo=stockCatalogoespejo.subtract(restar);
			}else if(catalogo.getVaStockCatalogo()==null || catalogo.getVaStockCatalogoEspejo()==null){
				stockCatalogo=restar;
				stockCatalogoespejo=restar;
				stockCatalogo.negate();
				stockCatalogoespejo.negate();
			}
			
			dao.actualizarPremiosDarBaja( catalogo.getIdCatalogo(),catalogo.getIdPremioCatalogo(), stockCatalogo, stockCatalogoespejo);
			return "Exito";
			}
		
		}else{
			dao.actualizarPremiosDarBaja( catalogo.getIdCatalogo(),catalogo.getIdPremioCatalogo(), new BigDecimal(0), new BigDecimal(0));
			return "Exito";
		}
		
		
		return "Error";
	}
	
	public List<ClpmCatalogo> obtenerListaCatalogosVigente(){
		return dao.obtenerListaCatalogosVigente();
	}
	
	public int sonCatalogosParalelos(String fechaInicio, String fechaFin){
		return dao.sonCatalogosParalelos(fechaInicio, fechaFin);
	}
	
	public String obteneridPremioInstantaneo(String idscatalogo){
		return dao.obteneridPremioInstantaneo(idscatalogo);
	}
	
	public String devolvermaximoCodPremioInstantaneo(String fechaInicio, String fechaFin){
	
		String idscatalogos="";
		String maximo="";
		int codpremio=0;
		List<ClpmCatalogo> lista=dao.obtenerCatalogoVigentes(fechaInicio, fechaFin);
		
		if(!lista.isEmpty()){
			
			for(int i=0; i<lista.size(); i++){
				idscatalogos= idscatalogos + lista.get(i).getId().toString()+",";
			
			}
			if(idscatalogos.endsWith(CLPConstantes.CARACTER_COMA)){
				idscatalogos=idscatalogos.substring(0, idscatalogos.length() - 1);
			}
			maximo=dao.obteneridPremioInstantaneo(idscatalogos);
			if(maximo.equals("0")){
				
				maximo=1+"";
			}
			else{	
				codpremio=Integer.parseInt(obteneridPremioInstantaneo(idscatalogos))+1;
				maximo=codpremio+"";
			}
				
		}else{
			
			maximo=1+"";
			
		}
		
		return maximo;

		
	}
	
	public List<BNCatalogoDetalle> obtenerPremiosCatalogos(String idCatalogo, String idArticulo){
		List<BNCatalogoDetalle> premios=dao.obtenerPremiosCatalogos(idCatalogo, idArticulo);
		
		if(premios==null){
			premios= new ArrayList<BNCatalogoDetalle>();
		}
		return premios;
	}
	
	public List<ClpmCatalogo> obtenerCatalogos(){
		return dao.obtenerCatalogos();
	}
	
}
